#ifndef _UTILS_FILE_H_
#define _UTILS_FILE_H_
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdbool.h>
    /**
     * @brief 写文件
     *
     * @param file 路径
     * @param position 偏移
     * @param data 待写入数据地址
     * @param length 待写入数据长度
     * @return int 成功为写入长度, 失败-1
     */
    extern int utils_file_write(const char *file, int position, const char *data, int length);

    /**
     * @brief 读文件
     *
     * @param file 路径
     * @param position 偏移
     * @param data 待写入数据地址
     * @param length 待写入数据长度
     * @return int 成功为写入长度, 失败-1
     */
    extern int utils_file_read(const char *file, int position, char *data, int length);

    /**
     * @brief 获取文件的长度
     *
     * @param file 路径
     * @param len 文件的长度
     * @return int 成功0, 失败-1
     */
    extern int utils_file_length(const char *file, int *len);

    /**
     * @brief 对文件上锁,文件若不存在则会创建
     *
     * @param file 路径
     * @return int 成功>0, 失败<0(无法创建文件),=0(已经上锁)
     */
    extern int utils_file_lock(const char *file);

    /**
     * @brief 对文件解锁,并关闭 fd
     *
     * @param fd File descriptor
     */
    extern void utils_file_unlock(int fd);

    typedef void (*utils_file_search_cb_t)(const char *path, void *priv_data);

    /// @brief 查找指定目录下符合条件的文件
    /// @param path 目录
    /// @param keyword 文件名或其中包含的关键字
    /// @param is_fullname keyword 是否为文件名
    /// @param subdir 是否搜索其中的子目录
    /// @param cb 匹配到的结果回调
    extern void utils_file_search(const char *path, const char *keyword, bool is_fullname, bool subdir, utils_file_search_cb_t cb, void *priv);

    /**
     * @brief 移除目录下所有文件包括子目录
     *
     * @param path
     * @return int 成功0, 失败<0
     */
    extern int utils_file_remove_all(const char *path);

    /// @brief 创建目录 支持多级目录创建
    /// @param path 目录路径
    /// @param mode 权限
    /// @return int 成功0, 失败-1
    extern int utils_file_mkdir(const char *path, int mode);
#ifdef __cplusplus
}
#endif
#endif //_UTILS_FILE_H_